// LIB_GetDeviceDetailsPath
// V2.0
// auth:zhigang-li@siemens.com
// 制作和使用方法：
// 将以下的配置的格式写在项目的config文件夹下的 设备弹窗映射表.txt，没有的话可以手动新建一个，并保证格式是UTF8格式
// FMCS_MEP_VFD MEP_SYS/MEP_M/VFD/MAIN.xml 备注信息
// 其中第一列是DPTYPE
// 其中第二列是弹窗路径
// 其中第三列是备注信息（可以无）
// config文件的proj_path配置由下而上读取相对路径下的同名弹窗 映射表.txt，读取其中的配置信息。

// 路径字符串非空意味着存在这个文件
// sPath可能是：
// C:/WinCC_OA_Proj_319/FMCS_MEP_DEMO/config/设备弹窗映射表.txt
// C:/WinCC_OA_Proj_319/LIB319/config/设备弹窗映射表.txt

// 也同时保留了代码的方式构建匹配关系，见代码的switch语句，优先级较低。
//


string LIB_GetDeviceDetailsPath(string dp)
{
  string dpTypePath; // 弹窗路径

  string type = dpTypeName(dp); // device type , dp type name .

// 这里选择适配定制的dp type，将dpTypePath改写到定制的弹窗文件的路径。
  switch (type)
  {
//     也可以在这里写代码进行匹配设备和弹窗，效果相同...
    case "FMCS_MEP_VFD":
      dpTypePath = "MEP_M/icon_VFD/REFERENCE.xml";
      break;
//
//     case "FMCS_MEP_PUMP":
//       dpTypePath = "MEP_SYS/MEP_M/PUMP/MAIN.xml";
//       break;
    default:
      dpTypePath = "objects/LIB/faceplate/MAIN.xml";
  }

  if (!globalExists("g_mDevicePopupWindow"))
  {
    addGlobal("g_mDevicePopupWindow", MAPPING_VAR); //  设备与弹窗的映射关系

    int level ;

    bool isEnd = false;

    while (!isEnd)
    {
      level++; // start from 1
      //DebugTN("level", level) ;
      // 项目路径的 设备弹窗映射表.txt 路径。
      string sPath = getPath(CONFIG_REL_PATH, "设备弹窗映射表.txt", "", level);

      if (sPath != "") // 找到一个有效配置！
      {
        string str;
        fileToString(sPath, str); // 读出来字符串。

        if (str != "")
        {

          // 分解字符串。
          dyn_string dsLines = strsplit(str, "\n");

          for (int j = 1; j <= dynlen(dsLines); j++)
          {
            //csv的各种分割格式，统一转换成空格。
            strreplace(dsLines[j], "\t", " "); // 对于制表符，转换成空格。
            strreplace(dsLines[j], ",", " "); // 对于,，转换成空格。
            strreplace(dsLines[j], "，", " "); // 对于，，转换成空格。
            strreplace(dsLines[j], ";", " "); // 对于;，转换成空格。
            strreplace(dsLines[j], "；", " "); // 对于；，转换成空格。

            dyn_string dsColumns = strsplit(dsLines[j], " ");  // 按空格进行拆分，应该是2列
            //DebugN("解析行", dsColumns);

            // 错误处理！
            if (dynlen(dsColumns) < 2)
            {
              DebugN(__FILE__, __FUNCTION__, __LINE__, "错误！", sPath, "第" + j + "行不符合规范", dsLines[j]);
            }

            // 正确的配置行,存储到 g_mDevicePopupWindow
            // 例如： FMCS_MEP_VFD MEP_SYS/MEP_M/VFD/MAIN.xml
            if (!mappingHasKey(g_mDevicePopupWindow, dsColumns[1]))
            {
              g_mDevicePopupWindow[(string)dsColumns[1] ] = (string)dsColumns[2];   //添加到 g_mDevicePopupWindow
            }
            else
            {
              //已经配置过相同的了！
              // DebugN(__FILE__, __FUNCTION__, __LINE__, "错误！", sPath, "第" + j + "行不符合规范", dsColumns[1] + "已经存在！");
            }

          }
        }
      }

      // 通过config 路径是否是PVSS_PATH，判断while的终止点level
      string sConfigPath = getPath(CONFIG_REL_PATH, "config", "", level);

      strreplace(sConfigPath, "config/config", "");

      if (sConfigPath == PVSS_PATH)   // PVSS_PATH   C:/Siemens/Automation/WinCC_OA/3.19/
      {
        isEnd = true;
      }
    }

  }

  // DebugN(g_mDevicePopupWindow, type);


  // 读出来弹窗路径，映射关系是dp type -->  弹窗路径
  if (mappingHasKey(g_mDevicePopupWindow, type))
  {
    dpTypePath = g_mDevicePopupWindow[type] ;
  }

  return dpTypePath;
}


// 旧版本的 LIB_GetDeviceDetailsPath
// 缺点：仅能支持当前项目路径下。无法在整合的路径下自动识别多个库的对应关系。淘汰了。
string LIB_GetDeviceDetailsPath____OLD___(string dp)
{

  //默认的弹窗的路径
  string dpTypePath;

  string dpType =   dpTypeName(dp); // 获得dp type 的名称

  // 这里选择适配定制的dp type，将dpTypePath改写到定制的弹窗文件的路径。
  switch (dpType)
  {
//     在这里写...
//     case "FMCS_MEP_VFD":
//       dpTypePath = "MEP_SYS/MEP_M/VFD/MAIN.xml";
//       break;
//
//     case "FMCS_MEP_PUMP":
//       dpTypePath = "MEP_SYS/MEP_M/PUMP/MAIN.xml";
//       break;
    default:
      dpTypePath = "objects/LIB/faceplate/MAIN.xml";
  }

  return dpTypePath;

}

